package com.tjbank.cssys.service.impl;

import java.util.Date;
import java.util.List;

import com.tjbank.cssys.framework.base.enums.YesOrNoEnum;
import com.tjbank.cssys.framework.base.exception.ServiceException;
import com.tjbank.cssys.framework.base.util.GeneratIDUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import com.tjbank.cssys.api.MenuService;
import com.tjbank.cssys.dto.MenuDTO;
import com.tjbank.cssys.mybatis.IamMenuDao;
import com.tjbank.cssys.mybatis.IamPermissionDao;
import com.tjbank.cssys.mybatis.entity.IamMenu;
import com.tjbank.cssys.mybatis.entity.IamMenuKey;
import com.tjbank.cssys.mybatis.entity.IamPermission;
import com.tjbank.cssys.mybatis.entity.IamPermissionKey;
import com.tjbank.cssys.mybatis.sqlbuilder.IamMenuSqlBuilder;
import com.tjbank.cssys.mybatis.sqlbuilder.IamPermissionSqlBuilder;
import com.tjbank.cssys.service.convert.MenuConvert;
import com.tjbank.cssys.service.enums.PermTypeEnum;
import com.tjbank.cssys.service.util.ForestNodeMerger;

/**
 * 菜单
 * 
 * Package : com.tansun.magicube.iam.service.impl
 * 
 * @author -- lijiangtao 2020年5月5日 下午3:13:41
 */
@Service
public class MenuServiceImpl implements MenuService {

	@Autowired
	private IamMenuDao menuDao;

	@Autowired
	private IamPermissionDao permissionDao;

	/**
	 * 新增菜单
	 * 
	 * @param menuDTO
	 * @return
	 * @author -- lijiangtao 2020年7月13日 下午2:53:26
	 */
	@Override
	public Integer addMenu(MenuDTO menuDTO) {
		IamMenu menu = MenuConvert.INSTANCE.dtoToEntity(menuDTO);
		menu.setId(GeneratIDUtil.getUUId());
		menu.setCreateTime(new Date());
		menu.setUpdateTime(new Date());
		this.addPermission(menu);
		return menuDao.insert(menu);
	}

	/**
	 * 新增菜单权限
	 * 
	 * @param menu
	 * @author -- lijiangtao 2020年7月24日 下午12:05:01
	 */
	private void addPermission(IamMenu menu) {
		IamPermission permission = new IamPermission();
		permission.setId(menu.getId());
		permission.setPermName(menu.getMenuName());
		permission.setMenuId(menu.getParentId());
		permission.setEleType("menu");
		permission.setPermType(PermTypeEnum.MENU_PERM.getCode());
		permission.setCreateUser(menu.getCreateUser());
		permission.setCreateTime(new Date());
		permission.setUpdateTime(new Date());
		permission.setIsDeleted(YesOrNoEnum.NO.getCode());
		permissionDao.insert(permission);
	}

	/**
	 * 查询菜单
	 * 
	 * @return
	 * @author -- lijiangtao 2020年7月13日 下午2:54:40
	 */
	@Override
	public List<MenuDTO> menuTreeList(MenuDTO menuDTO) {
		IamMenuSqlBuilder sqlBuilder = new IamMenuSqlBuilder();
		sqlBuilder.andIsDeletedEqualTo(YesOrNoEnum.NO.getCode()).orderByMenuSort(false);
		if (StringUtils.isNotBlank(menuDTO.getMenuName())) {
			sqlBuilder.andMenuNameLikeBoth(menuDTO.getMenuName());
		}
		return ForestNodeMerger.merge(MenuConvert.INSTANCE.entitiesToDtoList(menuDao.selectListBySqlBuilder(sqlBuilder)));
	}

	/**
	 * 编辑菜单
	 * 
	 * @param menuDTO
	 * @return
	 * @author -- lijiangtao 2020年6月21日 下午7:30:03
	 */
	@Override
	@Transactional
	public Integer updateMenu(MenuDTO menuDTO) {
		this.checkMenuId(menuDTO.getId());
		IamMenu entity = MenuConvert.INSTANCE.dtoToEntity(menuDTO);
		entity.setUpdateTime(new Date());
		IamMenuSqlBuilder sqlBuilder = new IamMenuSqlBuilder();
		sqlBuilder.andIdEqualTo(entity.getId());
		this.updatePerm(entity);
		return menuDao.updateBySqlBuilderSelective(entity, sqlBuilder);
	}

	/**
	 * 更新权限信息
	 * 
	 * @param entity
	 * @author -- lijiangtao 2020年7月30日 下午5:08:45
	 */
	private void updatePerm(IamMenu entity) {
		IamPermissionSqlBuilder sqlBuilder = new IamPermissionSqlBuilder();
		sqlBuilder.andIdEqualTo(entity.getId());
		IamPermission permission = new IamPermission();
		permission.setPermName(entity.getMenuName());
		permissionDao.updateBySqlBuilderSelective(permission, sqlBuilder);
	}

	/**
	 * 删除菜单
	 * 
	 * @param menuId
	 * @return
	 * @author -- lijiangtao 2020年6月16日 下午3:38:24
	 */
	@Override
	@Transactional
	public Integer deleteMenu(String menuId) {
		this.checkMenuId(menuId);
		IamPermissionSqlBuilder sqlBuilder = new IamPermissionSqlBuilder();
		sqlBuilder.andMenuIdEqualTo(menuId);
		if (!permissionDao.selectListBySqlBuilder(sqlBuilder).isEmpty()) {
			throw new ServiceException("菜单下存在权限");
		}
		permissionDao.deleteByPrimaryKey(new IamPermissionKey(menuId));
		return menuDao.deleteByPrimaryKey(new IamMenuKey(menuId));
	}

	/**
	 * 校验菜单ID
	 * 
	 * @param menuId
	 * @author -- lijiangtao 2020年6月21日 下午7:30:35
	 */
	private void checkMenuId(String menuId) {
		if (StringUtils.isBlank(menuId)) {
			throw new ServiceException("菜单ID不能为空");
		}
	}
}
